import java.io.*;
import java.net.ServerSocket;
import java.util.StringTokenizer;
import Elementos.Sensor;
import Elementos.SocketManager;
import Elementos.Usuario;

public class Servidor{
		
	//ATRIBUTOS
	private int id;
	private boolean gps; //true: activado; false: desactivado
	private char estado; //f: funcionando; p: parado; m: en mantenimiento
	private static Usuario[] ListaUsuarios = new Usuario[100];
	private static Sensor[] ListaSensores = new Sensor[10];

	//CONSTRUCTOR CON PARAMETROS
	public Servidor(int id, boolean gps, char estado, Usuario[] ListaUsuarios, Sensor[] ListaSensores){
		this.id = id;
		this.gps = gps;
		this.estado = estado;
		this.ListaUsuarios = ListaUsuarios;
		this.ListaSensores = ListaSensores;
	}
	
	//CONSTRUCTOR SIN PARAMETROS
	public Servidor(){}

	//METODO PARA CARGAR
	public static void CargarDatos() throws Exception{
		java.io.FileInputStream is = new java.io.FileInputStream("Almacen.dat");
		java.io.ObjectInputStream ois = new java.io.ObjectInputStream(is);
		ListaUsuarios = (Usuario[]) ois.readObject();
		ListaSensores = (Sensor[]) ois.readObject();
		ois.close();
	}
	
	//METODO PARA GUARDAR
	public static void GuardarDatos() throws FileNotFoundException, IOException{
		java.io.FileOutputStream os = new java.io.FileOutputStream("Almacen.dat");
		java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(os);
		oos.writeObject(ListaUsuarios);
		oos.writeObject(ListaSensores);
		oos.close();
	}
	
	//METODO PARA BORRAR
	public static void BorrarDatos() throws FileNotFoundException, IOException{
		for(int i=0;i<100;i++){
			ListaUsuarios[i]=null;
		}
		for(int i=0;i<10;i++){
			ListaSensores[i]=null;
		}
		java.io.FileOutputStream os = new java.io.FileOutputStream("Almacen.dat");
		java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(os);
		oos.writeObject(ListaUsuarios);
		oos.writeObject(ListaSensores);
		oos.close();
	}
	
	//METODO PARA ARRANCAR EL SERVIDOR
	public static void ArrancarServidor(){
		try{
			ServerSocket welcomeSocket = new ServerSocket(6966);
			System.out.println("SERVIDOR ARRANCADO");
			SocketManager sm = new SocketManager(welcomeSocket.accept());
		    String s = (String) sm.Leer();
		    while(!(s.equals("SALIR"))){
		    	StringTokenizer st = new StringTokenizer(s);
		    	if(st.equals("USER")){
		    		sm.Escribir(USER(st.nextToken()));
		    	}else if (s.equals("ACCEDER")){
			    	//.....
			    } //.......
		    	s = (String) sm.Leer();
		    }		    			    
		}catch(Exception ex){
			System.err.println("main: "+ex);
			ex.printStackTrace();
        }
	}
	
	//METODO USER
	public static String USER (String nombre){
		boolean encontrado = false;
		for(int i=0; i<100; i++){
			if(ListaUsuarios[i] != null && ListaUsuarios[i].getNombre().equals(nombre)==true){
				encontrado=true;
			}
		}
		if(encontrado==true){
			return "211 OK"+'\n';
		}else if(nombre==""){
			return "411 ERR";
		}else{
			return "410 ERR";
		}
	}
	
	public static String PASS (String password, String nombre){
		boolean encontrado = false;
		int i = 0;
		while(encontrado==true && i<100){
			if(ListaUsuarios[i].getNombre().equals(nombre)==true){
				encontrado=true;
				i=i+1;
			}
		}
		i=i-1;
		if(ListaUsuarios[i].getPassword().equals(password)==true){
			return "212 OK";
		}else if(password==""){
			return "413 ERR";
		}else{
			return "412 ERR";
		}
	}
	
	public void LISTSENSOR (){
		// (!) PROBAR A METERLO EN EL MAIN
	}
	
	public void HISTORICO (int id_sensor){
		// (!) PROBAR A METERLO EN EL MAIN
	}
	
	/*public String ON (int id_sensor){
		
	}
	
	public String OFF (int id_sensor){
		
	}*/
	
	public String ONGPS (){
		if(gps==true){
			return "428 ERR";
		}else{
			return "215 OK";
		}
	}
	
	public String OFFGPS (){
		if(gps==false){
			return "429 ERR";
		}else{
			return "216 OK";
		}
	}
	
	public void GET_VALACT (int id_sensor){
		
	}
	
	public String GET_LOC (){
		if(gps==false){
			return "429 ERR";
		}else{
			return "217 OK";
		}
	}
	
	public String SALIR (){
		return "218 OK";
	}
	
	
	
	public static void main (String [] args){
		//DATOS DE PRUEBA
		Usuario u = new Usuario("jj","jj");
		ListaUsuarios[0]=u;
		ArrancarServidor();
	}
}